perm filename PURGE.SAI[SYS,HE]2 blob
sn#013492 filedate 1972-11-20 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00005 00002 BEGIN "PURGE"
00008 00003 ⊃ This is the magic macro which defines good files, their main extension,
00011 00004 ⊃ TOB FILES
00013 00005 ⊃ GENERAL FILES
00017 00006 ⊃ Now we use the magic macro to generate our tables
00018 00007 ⊃ This is the TTY output routine
00021 00008 ⊃ This routine outputs the illegal file names.
00024 00009 ⊃ Now we get down to business
00026 ENDMK
⊗;
BEGIN "PURGE"
STRING ARRAY UFD_FILE, UFD_EXT[1:1000];
INTEGER UFDLENGTH;
DEFINE DSK="1", LPT="2", CRLF="('15&'12)", ⊃="COMMENT";
⊃ make CVXSTR honest;
SIMPLE STRING PROCEDURE CVXX(INTEGER VAL);
BEGIN STRING FOO;
INTEGER I;
FOO ← CVXSTR(VAL);
FOR I ← LENGTH(FOO) STEP -1 UNTIL 1 DO IF FOO[I FOR 1]≠" " THEN DONE;
RETURN(IF I THEN FOO[1 FOR I] ELSE "");
END;
⊃ read ufd file;
SIMPLE PROCEDURE UFDREAD;
BEGIN INTEGER EOF, SIXBIT, FLAG;
OPEN(DSK,"DSK",8,2,0,128,EOF,EOF);
LOOKUP(DSK,"SYS HE.UFD[1,1]",FLAG);
IF FLAG THEN USERERR(0,0,"UFD LOOKUP ERROR");
UFDLENGTH ← 0;
WHILE TRUE DO
BEGIN
SIXBIT ← WORDIN(DSK);
IF EOF THEN DONE;
IF SIXBIT THEN
BEGIN
UFD_FILE[UFDLENGTH←UFDLENGTH+1] ← CVXX(SIXBIT);
UFD_EXT[UFDLENGTH] ← CVXX(WORDIN(DSK) LAND '777777000000);
END ELSE WORDIN(DSK);
WORDIN(DSK);
WORDIN(DSK);
END;
CLOSE(DSK);
END;
DEFINE EXT_LENGTH="18";
PRELOAD_WITH "SAI","FAI","MAC","F4","REL","DMP","","LST","WRU",
"TJ","ORY","TRP","DAT","CAL","TXT","HDR","SEG","LNK","RUN";
SAFE STRING ARRAY COMMON_EXT[0:EXT_LENGTH];
DEFINE SAI="1", FAI="2", MAC="4", F4="'10", REL="'20", DMP="'40", NUL="'100",
LST="'200",WRU="'400",TJ="'1000",ORY="'2000",TRP="'4000",DAT="'10000",CAL="'20000",
TXT="'40000",HDR="'100000",SEG="'200000",LNK="'400000",RUN="'1000000",
BIT(I,A)="MORE_EXT[I] LAND A";
DEFINE NULLIND="6"; ⊃ INDEX OF NULL EXT.;
⊃ This is the magic macro which defines good files, their main extension,
and flags for their extensions. ;
DEFINE XX="
⊃ KKP FILES;
ZZ(EDGE,SAI+REL+DMP), ⊃ EDGE FOLLOWER MAIN PROGRAM;
ZZ(MISEDG,SAI+REL), ⊃ EDGE FOLLOWER UTILITY ROUTINES;
ZZ(CONTRL,SAI+REL), ⊃ EDGE FOLLOWER CONTROL PROGRAM;
ZZ(SCANER,SAI+REL), ⊃ EDGE FOLLOWER ACCOMODATION ROUTINES;
ZZ(CURVE,SAI+REL+DMP), ⊃ CURVE FITTER MAIN PROGRAM;
ZZ(MISCUR,SAI+REL), ⊃ CURVE FITTER UTILITY PROGRAMS;
ZZ(CURFAI,FAI+REL), ⊃ CURVE FITTER FAIL ROUTINES;
ZZ(HE,SAI), ⊃ HAND/EYE MONITOR (DUMP ON [1,3]);
ZZ(DOHE,NUL), ⊃ COMPILES, LOADS, AND SAVES HE ON SYS;
ZZ(IIDRV,SAI+DMP+WRU), ⊃ NEW DRIVER FOR UTILITY PACKAGE;
ZZ(HEUTIL,SAI+WRU), ⊃ HAND/EYE UTILITY ROUTINES;
ZZ(RUNII,NUL), ⊃ DO FILE FOR RUNNING IIDRV;
ZZ(HEMACR,NUL), ⊃ MACROS FOR UTILITY ROUTINES;
⊃ SHY FILES;
ZZ(CAMERA,SAI+DMP), ⊃ CAMERA CALIBRATION PROGRAM;
ZZ(OP1,MAC+REL), ⊃ OPERATOR FOR CAMERA;
ZZ(SOBMAT,SAI+REL), ⊃ CAMERA UTILITY ROUTINES;
ZZ(DATA,NUL), ⊃ CALIBRATION DATA FOR CAMERA;
ZZ(AFD,SAI+DMP+LNK+RUN),⊃ DRIVER FOR FOCUS PROGRAM;
ZZ(GILFOC,SAI+DMP), ⊃ FOCUS PROGRAM;
ZZ(GILEYE,SAI+DMP), ⊃ CORNER FINDER PROGRAM;
ZZ(TVSER,SAI), ⊃ SOURCE FILE COMMON TO AFD,GILFOC,GILEYE;
ZZ(STKDRV,SAI+DMP), ⊃ ?????;
ZZ(CALDRV,SAI+DMP), ⊃ ?????;
ZZ(HANDSE,SAI), ⊃ SOURCE FILE COMMON TO STKDRV AND CALDRV;
ZZ(CAL,LNK+RUN), ⊃ RUN CONTROL FILES FOR CALDRV;
ZZ(STK,LNK+RUN), ⊃ RUN CONTROL FILES FOR STKDRV;
⊃ RPO FILES;
ZZ(SIMPLE,SAI+DMP), ⊃ SIMPLE BODY RECOGNIZER;
ZZ(SIMAUX,SAI), ⊃ REST OF SIMPLE;
ZZ(DPDP,F4+REL), ⊃ SIMPLE UTILITY ROUTINES;
ZZ(MODELS,TRP), ⊃ SIMPLE'S PROTOTYPES;
⊃ TOB FILES;
ZZ(COLOR,SAI+DMP), ⊃ COLOR RECOGNIZER;
⊃ JMT FILES;
ZZ(VERIFY,SAI+DMP), ⊃ LINE VERIFIER;
⊃ LOU FILES;
ZZ(MATRIX,FAI+REL), ⊃ MATRIX ARITH. UTILITY ROUTINES;
ZZ(VECT,FAI+REL), ⊃ VECTOR ARITH. UTILITY ROUTINES;
ZZ(SAILIB,SAI+REL), ⊃ ARM UTILITY ROUTINES;
ZZ(HAND,SAI+DMP), ⊃ ARM CONTROL PROGRAM;
ZZ(INTFAC,FAI+REL),
ZZ(WAVE,SAI+DMP+NUL), ⊃ ARM TESTING PROGRAM;
ZZ(MOVE,SAI+DMP),
ZZ(MODEL,SAI+DMP), ⊃ MODEL BUILDER;
ZZ(VECTOR,SAI), ⊃ VECTOR DECLARATIONS;
ZZ(RUNARM,NUL), ⊃ DO FILE FOR RUNNING ARM;
ZZ(ARMCAL,NUL),
ZZ(ARMDYN,NUL),
ZZ(UNDER,FAI+REL), ⊃ ARM UTILITY ROUTINES;
ZZ(DRIVE,FAI+REL),
ZZ(ARM,DMP),
ZZ(ARMDF,NUL),
ZZ(ARMUS,NUL),
ZZ(ARMSW,NUL),
ZZ(ARMFN,NUL),
ZZ(TRAJ,SAI),
ZZ(YELLOW,SAI), ⊃ ARM CONSTANTS;
ZZ(TOWER,NUL), ⊃ TOWER OF HANOI PROGRAMS;
ZZ(NLF,SAI+DMP),
ZZ(HANOI,NUL),
⊃ GENERAL FILES;
ZZ(PREAMB,SAI+TXT), ⊃ GLOBAL MODEL DEFINITIONS;
ZZ(EYE,WRU), ⊃ EDGE FOLLOWER DOCUMENTATION-SOURCE;
ZZ(HAND,WRU), ⊃ HAND/EYE MONITOR DOCUMENTATION - PART I;
ZZ(MESSAG,WRU), ⊃ DITTO - PART II;
ZZ(MONITR,WRU), ⊃ DITTO - PART III;
ZZ(MACROS,NUL), ⊃ LOAD MACROS FOR II SYSTEM;
ZZ(PURGE,SAI+DMP), ⊃ THIS PROGRAM;
ZZ(RPG,NUL), ⊃ COMPILE FILE FOR ALL SAIL PROGRAMS;
ZZ(GLBNEW,SEG), ⊃ SAVE SEGMENT FOR II;
ZZ(PREMAK,SAI+DMP), ⊃ GENERATES COMMENTLESS PREAMBLE FILE;
ZZ(CALPLT,SAI+DMP), ⊃ PLOTTER DUMP ROUTINE FOR EDGE POINTS;
ZZ(PLOTS,FAI+REL), ⊃ SPECIAL SAILABLE CALCOMP ROUTINES;
ZZ(CAMDRV,NUL+DMP), ⊃ NEW CAMERA MOVER;
ZZ(DPYSUB,HDR+SAI+REL), ⊃ DISPLAY HEADER FILE;
ZZ(DISPLY,FAI+REL), ⊃ DISPLAY FAIL FILE;
ZZ(SQRT,FAI+REL), ⊃ SQUARE ROOT ROUTINE;
ZZ(SAITRG,NUL+FAI+REL), ⊃ SAIL TRIG FUNCTIONS - HEAD AND TEXT;
ZZ(CKSUM,DAT), ⊃ SYSTEM CHECKSUM;
ZZ(HASH,FAI+REL), ⊃ HASH CODER FOR MAKING NEW SEGMENT;
ZZ(PICTUR,SAI), ⊃ PICTURE INPUT PROGRAM;
ZZ(MAKSEG,SAI+DMP) ⊃ MAKE A NEW GLOBAL SEGMENT;
";
DEFINE FILES="77"; ⊃ This is the number of good files;
⊃ Now we use the magic macro to generate our tables;
DEFINE ZZ(A,B)="""A""";
PRELOAD_WITH XX;
SAFE STRING ARRAY GOOD_FILES[1:FILES];
DEFINE ZZ(A,B)="B";
PRELOAD_WITH XX;
SAFE INTEGER ARRAY MORE_EXT[1:FILES];
⊃ This routine is true if one of the common extensions for file GOOD_FILE[I] is E;
SIMPLE BOOLEAN PROCEDURE EQUEXT(STRING E; INTEGER I);
BEGIN INTEGER J;
FOR J ← 0 STEP 1 UNTIL EXT_LENGTH DO
IF BIT(I, 1 LSH J)∧EQU(COMMON_EXT[J],E) THEN RETURN(TRUE);
RETURN(FALSE);
END;
⊃ This is the LPT output routine;
SIMPLE PROCEDURE LPTOUT(REFERENCE STRING FOO);
OUT(LPT,FOO);
⊃ This is the TTY output routine;
BOOLEAN III; ⊃ TRUE if we are on a display;
INTEGER TTY_OUT;
DEFINE TTY_MAX="20"; ⊃ Pause after this many line if we are on a display;
SIMPLE PROCEDURE TTYOUT(REFERENCE STRING FOO);
BEGIN
IF III∧TTY_OUT≥TTY_MAX THEN
BEGIN
OUTSTR("TYPE <CR> TO CONTINE");
INCHWL;
TTY_OUT ← 0;
END;
OUTSTR(FOO);
TTY_OUT ← TTY_OUT + 1;
END;
⊃ This is the null output routine;
SIMPLE PROCEDURE NULLOUT(REFERENCE STRING FOO);
RETURN;
⊃ This routine types the commands;
SIMPLE PROCEDURE COMMANDS;
BEGIN
OUTSTR(CRLF&"COMMANDS ARE:"&CRLF);
OUTSTR("GOOD_FILES→TTY GOOD_FILES→LPT BAD_FILES→TTY BAD_FILES→LPT DELETE_BAD_FILES"&CRLF);
OUTSTR(" 1<CR> 2<CR> 3<CR> 4<CR> 5<CR>"&CRLF);
END;
⊃ This routine outputs the list of good files;
SIMPLE PROCEDURE OUT_GOOD(PROCEDURE DEVICE);
BEGIN STRING FOO,Z;
INTEGER I, J;
DEVICE(Z←"GOOD FILES ARE:"&CRLF);
FOR I ← 1 STEP 1 UNTIL FILES DO
BEGIN
FOO ← GOOD_FILES[I];
IF MORE_EXT[I] THEN FOR J←0 STEP 1 UNTIL EXT_LENGTH DO
IF BIT(I,1 LSH J)∧J≠NULLIND THEN FOO←FOO&"."&COMMON_EXT[J]&" ";
DEVICE(Z←FOO&CRLF);
END;
DEVICE(Z←CRLF);
END;
BOOLEAN BADFLG; ⊃ TRUE if OUT_BAD called;
BOOLEAN ARRAY BAD_FLAGS[1:1000];
⊃ This routine outputs the illegal file names.
It also generates a table of flags indicating the illegal files;
SIMPLE PROCEDURE OUT_BAD(PROCEDURE DEVICE);
BEGIN STRING E, F, FOO, Z;
INTEGER I, J, COUNT;
BADFLG ← TRUE;
DEVICE(Z←"ILLEGAL FILES ARE:"&CRLF);
COUNT ← 0;
FOO ← NULL;
FOR I ← 1 STEP 1 UNTIL UFDLENGTH DO
BEGIN
F ← UFD_FILE[I];
E ← UFD_EXT[I];
FOR J←1 STEP 1 UNTIL FILES DO IF EQU(F,GOOD_FILES[J])∧EQUEXT(E,J) THEN DONE;
IF BAD_FLAGS[I] ← J>FILES THEN
BEGIN
IF COUNT≥4 THEN
BEGIN
DEVICE(Z←FOO&CRLF);
FOO ← NULL;
COUNT ← 0;
END;
FOO ← FOO&((F&(IF LENGTH(E) THEN "."&E ELSE "")&" ")[1 FOR 12]);
COUNT ← COUNT+1;
END;
END;
DEVICE(Z←FOO&CRLF&CRLF);
END;
⊃ This routine deletes illegal files;
SIMPLE PROCEDURE DELETEX;
BEGIN BOOLEAN FLAG;
STRING E, F;
INTEGER I;
IF ¬BADFLG THEN OUT_BAD(NULLOUT);
FOR I←1 STEP 1 UNTIL UFDLENGTH DO IF BAD_FLAGS[I] THEN
BEGIN
F ← UFD_FILE[I];
E ← UFD_EXT[I];
F ← F&(IF E THEN "."&E ELSE "");
LOOKUP(DSK,F,FLAG);
IF ¬FLAG THEN RENAME(DSK,"",0,FLAG);
OUTSTR(F&(IF FLAG THEN " NOT" ELSE "")&" DELETED"&CRLF);
BAD_FLAGS[I] ← FALSE;
END;
UFDREAD; ⊃ Read new list of files;
END;
⊃ Now we get down to business;
INTEGER COM, EOF;
LABEL LOOP;
BADFLG ← FALSE;
UFDREAD;
COMMANDS;
START_CODE DEFINE TTYUUO="'51000000000";
SETOM 1;
TTYUUO 6,1;
SETZM III;
TLNE 1,'420000;
SETOM III;
END;
LOOP: OUTSTR(CRLF&"COMMAND IS ");
COM ← CVD(INCHWL);
IF COM LAND 1 THEN TTY_OUT←0 ELSE OPEN(LPT,"LPT",0,0,2,128,EOF,EOF);
CASE COM-1 OF
BEGIN
OUT_GOOD(TTYOUT);
OUT_GOOD(LPTOUT);
OUT_BAD(TTYOUT);
OUT_BAD(LPTOUT);
BEGIN
IF ¬BADFLG THEN
BEGIN
OUTSTR("WANT A LIST OF ILLEGAL FILES FIRST?"&CRLF);
IF INCHWL≠"N" THEN GO TO LOOP;
END;
DELETEX;
END;
END;
IF ¬(COM LAND 1) THEN RELEASE(LPT);
IF III THEN COMMANDS;
GO TO LOOP;
END;